Ed Sheeran

mean_mat_ed <- Reduce('+', list_markov_fits_ed) / length(list_markov_fits_ed)
mean_mat_ed
          -1         0         1
-1 0.1029404 0.5414117 0.3556480
0  0.1898299 0.4857504 0.3244197
1  0.1561468 0.4475325 0.3963208
capture.output(mean_mat_ed, file = "./output/mean_mat_ed.txt")
list_dist_mat_ed <- c()
for (mat in 1:length(list_markov_fits_ed)){
      list_dist_mat_ed[mat] = norm(list_markov_fits_ed[[mat]]-mean_mat_ed, "2")
}  
list_dist_mat_ed
 [1] 0.9537567 0.4806063 0.5712028 0.2780369 0.5231699 0.8306076 0.6100964 0.4603718 0.2204686 0.4030709 0.3967077 0.2820975 0.5475826
[14] 0.4969312 0.7851138 0.3379739 0.7441436 0.9734839 0.7439216 0.2711410 0.7598170 0.2000554 0.6392504 0.2514591 0.4241124 0.3456456
[27] 0.4347247 0.4307891 0.6524258 0.5081901 0.5459392 0.5446394 0.7563659 0.6890563 0.6195961 1.0708798 0.3020143 0.6157990 0.5451637
[40] 0.9257862 0.3589320 0.4462151 0.2763736 0.7625905 0.6834804 0.5777634 0.4282110 0.3766970 0.5631446 0.6958793 0.2388591 0.7555812
[53] 0.5471722 0.6387449 0.6013071 0.5428908 0.5059987 0.8229587 0.6868060 0.6050535 0.4999246 0.4112407 0.9553359 0.4558284 0.4421817
[66] 0.5393247 0.6797989 0.5484254 0.9258251 0.7521217 0.4791900 0.1384000 0.7226801 0.5631113
capture.output(list_dist_mat_ed, file = "./output/list_dist_mat_ed.txt")

Beyonce

mean_mat_bey <- matrix(0, nrow = 3, ncol = 3, 
                       dimnames = list(c("-1","0","1"), c("-1","0","1")))
for (mat in 1:length(list_markov_fits_bey)){
   mat_dim = dim(list_markov_fits_bey[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         mean_mat_bey = mean_mat_bey + list_markov_fits_bey[[mat]]
         }
}  
mean_mat_bey <- mean_mat_bey / length(list_markov_fits_bey)
mean_mat_bey
          -1         0         1
-1 0.1460341 0.4890268 0.3057286
0  0.1459013 0.5342153 0.2672518
1  0.1566225 0.4225018 0.3682441
capture.output(mean_mat_bey, file = "./output/mean_mat_bey.txt")
list_dist_mat_bey <- c()
for (mat in 1:length(list_markov_fits_bey)){
   mat_dim = dim(list_markov_fits_bey[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         list_dist_mat_bey[mat] = norm(list_markov_fits_bey[[mat]]-mean_mat_bey, "2")
         }
}  
list_dist_mat_bey = list_dist_mat_bey[-which(sapply(list_dist_mat_bey, is.na))]
list_dist_mat_bey
  [1] 0.4202188 0.3459907 0.5092226 0.5218670 0.6328542 0.2217953 0.3724594 1.0206892 0.9043789 0.7091226 0.9043789 0.9138329 1.0083410
 [14] 0.2702278 0.3600355 0.5397832 0.4366823 0.4859173 0.6231536 0.7741977 0.3191412 0.3169171 0.4205531 0.3659351 0.5879888 0.9865895
 [27] 0.6227144 0.6396214 0.2706628 0.3663045 0.4019883 0.3089281 0.3668241 0.8031833 0.6840277 0.6728014 0.6911200 0.4213667 0.4482515
 [40] 0.3193762 0.3193762 0.9245008 0.8673472 0.7114759 0.7042243 0.8381733 0.6173951 0.2484953 0.2491921 0.7790438 1.1418561 1.4950026
 [53] 0.6479351 0.4728399 0.4602002 0.4066315 0.3631561 0.5135712 0.6234594 0.5616695 0.9735918 1.0003569 0.4544799 0.6183404 0.6799720
 [66] 0.8080549 0.2135049 0.2135049 0.3853724 0.9254430 0.3472038 0.5976581 0.6895155 0.9002857 0.4893069 0.6755515 0.6205885 0.5552749
 [79] 0.6757462 0.2031502 0.6820709 0.2811833 0.4566343 0.5515508 0.7494426 0.3544380 0.4857073 0.5021188 0.3913340 0.4450816 0.4361958
 [92] 0.5917191 0.6780765 0.5858061 0.6763345 0.4520182 0.8708271 0.6564636 0.4245052 0.3576588 0.4360322 0.4370517 0.6463447 0.7152434
[105] 0.6446776 0.6265685 0.8830363 0.9007345 0.3630299 0.3630299 0.3449603 0.4177420 0.6719570 0.6342988 0.6453822 0.6747602 0.3747334
[118] 0.4838358 0.4838358 0.6288128 0.4877523 0.9344510 0.4910860 0.4345565 0.7700717 0.4894490 0.6868030 0.5698461 0.5537371 0.2250225
[131] 0.2250225 0.2597367 0.1258154 0.6982545 0.5497452 0.5847589 0.5710392 0.5269963 0.6373952 0.8827076 0.7130232 0.5352370 0.4177985
[144] 0.1978997
capture.output(list_dist_mat_bey, file = "./output/list_dist_mat_bey.txt")

Coldplay

mean_mat_cold <- matrix(0, nrow = 3, ncol = 3, 
                        dimnames = list(c("-1","0","1"), c("-1","0","1")))
for (mat in 1:length(list_markov_fits_cold)){
   mat_dim = dim(list_markov_fits_cold[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         mean_mat_cold = mean_mat_cold + list_markov_fits_cold[[mat]]
         }
}  
mean_mat_cold <- mean_mat_cold/length(list_markov_fits_cold)
mean_mat_cold
          -1         0         1
-1 0.1426445 0.5164052 0.2228400
0  0.1643453 0.4744881 0.2430564
1  0.1218435 0.4509503 0.3090959
capture.output(mean_mat_cold, file = "./output/mean_mat_cold.txt")
list_dist_mat_cold <- c()
for (mat in 1:length(list_markov_fits_cold)){
   mat_dim = dim(list_markov_fits_cold[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         list_dist_mat_cold[mat] = norm(list_markov_fits_cold[[mat]]-mean_mat_cold, "2")
         }
}  
list_dist_mat_cold = list_dist_mat_cold[-which(sapply(list_dist_mat_cold, is.na))]
list_dist_mat_cold
  [1] 1.0380366 0.7264117 0.8067040 0.6177262 0.7340429 0.8344477 0.3876978 0.3876978 0.5280687 0.2530470 0.5600775 0.4218855 0.6952090
 [14] 0.3814347 1.0305913 0.7989766 0.5641597 0.5280591 0.7129838 0.6995019 0.4120369 0.6126253 1.1068390 0.6922021 0.6914751 0.6851990
 [27] 0.5735708 0.6486229 0.3500163 0.3562713 0.5732948 0.9562457 0.2911890 0.2972496 0.3585001 0.9622311 1.0423140 0.8858231 0.8858231
 [40] 0.5368285 0.3564401 0.3878167 0.9852330 1.2023223 0.5552363 0.7767494 0.7767494 0.6680037 0.5118261 0.5118261 0.7095729 0.7570452
 [53] 0.8526428 0.5028112 1.1084323 0.3786862 0.4275769 0.4391698 0.6670957 0.3424700 0.5025333 0.5251301 0.4269520 0.5570621 0.5797523
 [66] 0.6575479 0.6564300 0.9488238 0.5036985 0.5415833 1.0633437 0.6293600 0.5086942 0.7507159 0.5781944 0.8759395 0.9701011 0.4738359
 [79] 0.3974853 0.4705159 0.9735216 0.7939274 1.1117442 0.2575928 0.5929313 0.7654990 0.5681008 0.5876949 1.1932809 0.3881388 1.0154236
 [92] 0.9477065 0.6727312 0.3920044 0.6548543 0.5632832 0.4480058 0.6306804 0.6351824 0.3881530 0.5237934 0.4641842 0.6252632 0.6533964
[105] 0.5195117 0.6116280 0.6074200 0.7019052 0.7019052 0.4780324 0.7636676 0.2343534
capture.output(list_dist_mat_cold, file = "./output/list_dist_mat_cold.txt")

Maroon 5

mean_mat_mar <- Reduce('+', list_markov_fits_mar) / length(list_markov_fits_mar)
mean_mat_mar
          -1         0         1
-1 0.1638921 0.5058061 0.3303018
0  0.1811342 0.5068021 0.3120637
1  0.2184647 0.4699306 0.3116047
capture.output(mean_mat_mar, file = "./output/mean_mat_mar.txt")
list_dist_mat_mar <- c()
for (mat in 1:length(list_markov_fits_mar)){
      list_dist_mat_mar[mat] = norm(list_markov_fits_mar[[mat]]-mean_mat_mar, "2")
}  
list_dist_mat_mar
  [1] 0.8856572 0.9765110 0.5387939 0.4156876 0.3265012 0.4585595 0.4555691 0.3346954 0.3346954 0.5825714 0.5929400 0.5957727 0.3627424
 [14] 0.7594747 0.7378215 0.7000118 0.4771582 0.4210023 0.4236106 0.3413594 0.4726719 0.2947009 0.9950680 0.6499466 0.3765278 1.0499125
 [27] 0.3703184 0.2611149 0.7037910 0.5191387 0.7132881 0.4883984 0.4053413 0.4160455 0.4412144 0.3604909 0.9969026 0.4981996 0.7242688
 [40] 0.6416231 0.4740263 0.7519207 0.4358157 0.7264763 0.3212072 0.9716143 0.6304127 0.7662561 0.3499578 0.3499578 0.8491469 0.4298656
 [53] 0.5347117 0.4538057 0.3417515 1.2616624 0.4521684 0.5933563 0.4789111 0.5542405 0.2820611 0.4982724 0.4007688 0.4734759 0.4755346
 [66] 0.5098537 0.3996292 0.6251907 0.3278844 1.0243128 0.4974038 0.5147447 0.9268281 0.5126220 0.3697482 0.7125356 0.3975244 0.5999036
 [79] 0.3940251 0.6807064 0.8779239 0.3210230 0.7220820 0.8419075 0.6948076 0.6948076 0.6440616 0.5531300 0.4491324 0.4729400 0.4760037
 [92] 0.5036572 0.6250632 0.5770912 0.4472555 0.4272402 0.3008017 0.6763434 0.3620541 0.3573620 0.6227615
capture.output(list_dist_mat_mar, file = "./output/list_dist_mat_mar.txt")

Bruno Mars

mean_mat_bru <- matrix(0, nrow = 3, ncol = 3, 
                       dimnames = list(c("-1","0","1"), c("-1","0","1")))
for (mat in 1:length(list_markov_fits_bru)){
      mat_dim = dim(list_markov_fits_bru[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         mean_mat_bru = mean_mat_bru + list_markov_fits_bru[[mat]]
         }
}  
mean_mat_bru <- mean_mat_bru/length(list_markov_fits_bru)
mean_mat_bru
          -1         0         1
-1 0.1049378 0.5108022 0.3217600
0  0.1268274 0.5224307 0.2882418
1  0.1347153 0.4794023 0.3233824
capture.output(mean_mat_bru, file = "./output/mean_mat_bru.txt")
list_dist_mat_bru <- c()
for (mat in 1:length(list_markov_fits_bru)){
      mat_dim = dim(list_markov_fits_bru[[mat]])
      if(tryCatch(mat_dim[1]== 3 && 
                  mat_dim[2] == 3, error=function(e) FALSE)){
         list_dist_mat_bru[mat] = norm(list_markov_fits_bru[[mat]]-mean_mat_bru, "2")
         }
}  
list_dist_mat_bru = list_dist_mat_bru[-which(sapply(list_dist_mat_bru, is.na))]
list_dist_mat_bru
 [1] 0.5315717 0.6288928 0.6458052 0.6345398 0.6843743 0.8835470 0.3278965 0.1777100 0.3814114 0.5033405 0.5875405 0.5144431 0.8558442
[14] 0.4258347 0.6807949 0.6740909 0.5145711 0.2848972 0.9252163 0.5983692 0.3706881 0.5963959 0.7095785 0.5484127 0.5772312 0.8067278
[27] 0.3334287 0.6401021 0.6115501 0.3498766
capture.output(list_dist_mat_bru, file = "./output/list_dist_mat_bru.txt")
length(list_dist_mat_ed) / dim(df_ed_sheeran)[1]
[1] 0.902439
length(list_dist_mat_bey) / dim(df_beyonce)[1]
[1] 0.6990291
length(list_dist_mat_cold) / dim(df_cold)[1]
[1] 0.7044025
length(list_dist_mat_mar) / dim(df_mar)[1]
[1] 0.8211382
length(list_dist_mat_bru) / dim(df_bru)[1]
[1] 0.7692308
# devtools::install_github('hadley/ggplot2') # uncomment and run code to install the dev version of ggplot2.
library(plotly)
ed_sheeran_norms <- data.frame(normDist = unlist(list_dist_mat_ed))
beyonce_norms <- data.frame(normDist = unlist(list_dist_mat_bey))
coldplay_norms <- data.frame(normDist = unlist(list_dist_mat_cold))
maroon5_norms <- data.frame(normDist = unlist(list_dist_mat_mar))
bruno_norms <- data.frame(normDist = unlist(list_dist_mat_bru))
# combine your dataframes into one.  First make a new column in each.
ed_sheeran_norms$Artist <- 'Ed Sheeran'
beyonce_norms$Artist <- 'Beyonce'
coldplay_norms$Artist <- 'Coldplay'
maroon5_norms$Artist <- 'Maroon 5'
bruno_norms$Artist <- 'Bruno Mars'
# combine into your new data frame artist_norms.
artist_norms <- rbind(ed_sheeran_norms, beyonce_norms, 
                      coldplay_norms, maroon5_norms, bruno_norms)
# create our awesome plot.
p.1 <- ggplot(artist_norms, aes(normDist, fill = Artist)) + geom_density(alpha = 0.2)
p.1 <- ggplotly(p.1)
p.1
p.2 <- ggplot(artist_norms, aes(x = normDist)) + 
  geom_density(aes(fill = Artist)) + 
  facet_grid(~Artist) + 
  ggtitle("Normal Distance density plots by Artists")
p.2 <- ggplotly(p.2)
p.2

# htmlwidgets::saveWidget(as_widget(p.2), "02-density_plot_non-overlap.html")
p.3 <- plot_ly(artist_norms, 
               x = ~normDist, 
               color = ~Artist, 
               type = "box")
p.3

htmlwidgets::saveWidget(as_widget(p.3), "03-artists_box_plots.html")
test.txt <- read.table("./output/list_dist_mat_ed.txt", header=T)
test.txt 
ggnet2(network(rgraph(10, tprob = 0.25), directed = TRUE), arrow.size = 12)

Appendix code:

# mean_mat_ed <- matrix(0, nrow = 3, ncol = 3, dimnames = list(c("-1","0","1"), c("-1","0","1")))
# 
# for (mat in 1:length(list_markov_fits_ed)){ 
#       mean_mat_ed = mean_mat_ed + list_markov_fits_ed[[mat]]
# }
# 
# mean_mat_ed <- mean_mat_ed/length(list_markov_fits_ed)
# mean_mat_ed
# capture.output(mean_mat_ed, file = "./output/mean_mat_ed.txt")
# list(list_markov_fits_ed[[1]], list_markov_fits_ed[[2]])
# list_markov_fits_bey_clean = list_markov_fits_bey[-which(sapply(list_markov_fits_bey, dim != c(3, 3)))]
# mean_mat_bey <- Reduce('+', list_markov_fits_bey) / length(list_markov_fits_bey)
# mean_mat_bey
# mean_mat_mar <- matrix(0, nrow = 3, ncol = 3, dimnames = list(c("-1","0","1"), c("-1","0","1")))
# 
# for (mat in 1:length(list_markov_fits_mar)){
#       mean_mat_mar = mean_mat_mar + list_markov_fits_mar[[mat]]
# }  
# mean_mat_mar <- mean_mat_mar/length(list_markov_fits_mar)
# mean_mat_mar
# capture.output(mean_mat_cold, file = "./output/mean_mat_mar.txt")
LS0tDQp0aXRsZTogIk1hdGggMzgxIFByb2plY3QgMjogU2VudGltZW50IEFuYWx5c2lzIG9mIFNvbmdzIg0KYXV0aG9yOiAiRXVuamkgTGVlIHwgWXVhbiBRdSB8IEFybmF2IER1YmV5Ig0KZGF0ZTogIk5vdmVtYmVyIDI1LCAyMDE3Ig0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBodG1sX25vdGVib29rOg0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGRmX3ByaW50OiBwYWdlZA0KICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQNCi0tLQ0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCiMjIEVkIFNoZWVyYW4NCg0KYGBge3J9DQptZWFuX21hdF9lZCA8LSBSZWR1Y2UoJysnLCBsaXN0X21hcmtvdl9maXRzX2VkKSAvIGxlbmd0aChsaXN0X21hcmtvdl9maXRzX2VkKQ0KbWVhbl9tYXRfZWQNCmNhcHR1cmUub3V0cHV0KG1lYW5fbWF0X2VkLCBmaWxlID0gIi4vb3V0cHV0L21lYW5fbWF0X2VkLnR4dCIpDQpgYGANCg0KDQpgYGB7cn0NCmxpc3RfZGlzdF9tYXRfZWQgPC0gYygpDQpmb3IgKG1hdCBpbiAxOmxlbmd0aChsaXN0X21hcmtvdl9maXRzX2VkKSl7DQogICAgICBsaXN0X2Rpc3RfbWF0X2VkW21hdF0gPSBub3JtKGxpc3RfbWFya292X2ZpdHNfZWRbW21hdF1dLW1lYW5fbWF0X2VkLCAiMiIpDQp9ICANCmxpc3RfZGlzdF9tYXRfZWQNCmNhcHR1cmUub3V0cHV0KGxpc3RfZGlzdF9tYXRfZWQsIGZpbGUgPSAiLi9vdXRwdXQvbGlzdF9kaXN0X21hdF9lZC50eHQiKQ0KYGBgDQoNCg0KIyMgQmV5b25jZQ0KDQpgYGB7cn0NCm1lYW5fbWF0X2JleSA8LSBtYXRyaXgoMCwgbnJvdyA9IDMsIG5jb2wgPSAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgZGltbmFtZXMgPSBsaXN0KGMoIi0xIiwiMCIsIjEiKSwgYygiLTEiLCIwIiwiMSIpKSkNCg0KZm9yIChtYXQgaW4gMTpsZW5ndGgobGlzdF9tYXJrb3ZfZml0c19iZXkpKXsNCiAgIG1hdF9kaW0gPSBkaW0obGlzdF9tYXJrb3ZfZml0c19iZXlbW21hdF1dKQ0KICAgICAgaWYodHJ5Q2F0Y2gobWF0X2RpbVsxXT09IDMgJiYgDQogICAgICAgICAgICAgICAgICBtYXRfZGltWzJdID09IDMsIGVycm9yPWZ1bmN0aW9uKGUpIEZBTFNFKSl7DQogICAgICAgICBtZWFuX21hdF9iZXkgPSBtZWFuX21hdF9iZXkgKyBsaXN0X21hcmtvdl9maXRzX2JleVtbbWF0XV0NCiAgICAgICAgIH0NCn0gIA0KbWVhbl9tYXRfYmV5IDwtIG1lYW5fbWF0X2JleSAvIGxlbmd0aChsaXN0X21hcmtvdl9maXRzX2JleSkNCm1lYW5fbWF0X2JleQ0KY2FwdHVyZS5vdXRwdXQobWVhbl9tYXRfYmV5LCBmaWxlID0gIi4vb3V0cHV0L21lYW5fbWF0X2JleS50eHQiKQ0KYGBgDQoNCg0KYGBge3J9DQpsaXN0X2Rpc3RfbWF0X2JleSA8LSBjKCkNCmZvciAobWF0IGluIDE6bGVuZ3RoKGxpc3RfbWFya292X2ZpdHNfYmV5KSl7DQogICBtYXRfZGltID0gZGltKGxpc3RfbWFya292X2ZpdHNfYmV5W1ttYXRdXSkNCiAgICAgIGlmKHRyeUNhdGNoKG1hdF9kaW1bMV09PSAzICYmIA0KICAgICAgICAgICAgICAgICAgbWF0X2RpbVsyXSA9PSAzLCBlcnJvcj1mdW5jdGlvbihlKSBGQUxTRSkpew0KICAgICAgICAgbGlzdF9kaXN0X21hdF9iZXlbbWF0XSA9IG5vcm0obGlzdF9tYXJrb3ZfZml0c19iZXlbW21hdF1dLW1lYW5fbWF0X2JleSwgIjIiKQ0KICAgICAgICAgfQ0KfSAgDQpsaXN0X2Rpc3RfbWF0X2JleSA9IGxpc3RfZGlzdF9tYXRfYmV5Wy13aGljaChzYXBwbHkobGlzdF9kaXN0X21hdF9iZXksIGlzLm5hKSldDQpsaXN0X2Rpc3RfbWF0X2JleQ0KY2FwdHVyZS5vdXRwdXQobGlzdF9kaXN0X21hdF9iZXksIGZpbGUgPSAiLi9vdXRwdXQvbGlzdF9kaXN0X21hdF9iZXkudHh0IikNCmBgYA0KDQoNCiMjIENvbGRwbGF5DQoNCmBgYHtyfQ0KbWVhbl9tYXRfY29sZCA8LSBtYXRyaXgoMCwgbnJvdyA9IDMsIG5jb2wgPSAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgIGRpbW5hbWVzID0gbGlzdChjKCItMSIsIjAiLCIxIiksIGMoIi0xIiwiMCIsIjEiKSkpDQoNCmZvciAobWF0IGluIDE6bGVuZ3RoKGxpc3RfbWFya292X2ZpdHNfY29sZCkpew0KICAgbWF0X2RpbSA9IGRpbShsaXN0X21hcmtvdl9maXRzX2NvbGRbW21hdF1dKQ0KICAgICAgaWYodHJ5Q2F0Y2gobWF0X2RpbVsxXT09IDMgJiYgDQogICAgICAgICAgICAgICAgICBtYXRfZGltWzJdID09IDMsIGVycm9yPWZ1bmN0aW9uKGUpIEZBTFNFKSl7DQogICAgICAgICBtZWFuX21hdF9jb2xkID0gbWVhbl9tYXRfY29sZCArIGxpc3RfbWFya292X2ZpdHNfY29sZFtbbWF0XV0NCiAgICAgICAgIH0NCn0gIA0KbWVhbl9tYXRfY29sZCA8LSBtZWFuX21hdF9jb2xkL2xlbmd0aChsaXN0X21hcmtvdl9maXRzX2NvbGQpDQptZWFuX21hdF9jb2xkDQpjYXB0dXJlLm91dHB1dChtZWFuX21hdF9jb2xkLCBmaWxlID0gIi4vb3V0cHV0L21lYW5fbWF0X2NvbGQudHh0IikNCmBgYA0KDQpgYGB7cn0NCmxpc3RfZGlzdF9tYXRfY29sZCA8LSBjKCkNCmZvciAobWF0IGluIDE6bGVuZ3RoKGxpc3RfbWFya292X2ZpdHNfY29sZCkpew0KICAgbWF0X2RpbSA9IGRpbShsaXN0X21hcmtvdl9maXRzX2NvbGRbW21hdF1dKQ0KICAgICAgaWYodHJ5Q2F0Y2gobWF0X2RpbVsxXT09IDMgJiYgDQogICAgICAgICAgICAgICAgICBtYXRfZGltWzJdID09IDMsIGVycm9yPWZ1bmN0aW9uKGUpIEZBTFNFKSl7DQogICAgICAgICBsaXN0X2Rpc3RfbWF0X2NvbGRbbWF0XSA9IG5vcm0obGlzdF9tYXJrb3ZfZml0c19jb2xkW1ttYXRdXS1tZWFuX21hdF9jb2xkLCAiMiIpDQogICAgICAgICB9DQp9ICANCmxpc3RfZGlzdF9tYXRfY29sZCA9IGxpc3RfZGlzdF9tYXRfY29sZFstd2hpY2goc2FwcGx5KGxpc3RfZGlzdF9tYXRfY29sZCwgaXMubmEpKV0NCmxpc3RfZGlzdF9tYXRfY29sZA0KY2FwdHVyZS5vdXRwdXQobGlzdF9kaXN0X21hdF9jb2xkLCBmaWxlID0gIi4vb3V0cHV0L2xpc3RfZGlzdF9tYXRfY29sZC50eHQiKQ0KYGBgDQoNCg0KIyMgTWFyb29uIDUNCg0KYGBge3J9DQptZWFuX21hdF9tYXIgPC0gUmVkdWNlKCcrJywgbGlzdF9tYXJrb3ZfZml0c19tYXIpIC8gbGVuZ3RoKGxpc3RfbWFya292X2ZpdHNfbWFyKQ0KbWVhbl9tYXRfbWFyDQpjYXB0dXJlLm91dHB1dChtZWFuX21hdF9tYXIsIGZpbGUgPSAiLi9vdXRwdXQvbWVhbl9tYXRfbWFyLnR4dCIpDQpgYGANCg0KDQpgYGB7cn0NCmxpc3RfZGlzdF9tYXRfbWFyIDwtIGMoKQ0KZm9yIChtYXQgaW4gMTpsZW5ndGgobGlzdF9tYXJrb3ZfZml0c19tYXIpKXsNCiAgICAgIGxpc3RfZGlzdF9tYXRfbWFyW21hdF0gPSBub3JtKGxpc3RfbWFya292X2ZpdHNfbWFyW1ttYXRdXS1tZWFuX21hdF9tYXIsICIyIikNCn0gIA0KbGlzdF9kaXN0X21hdF9tYXINCmNhcHR1cmUub3V0cHV0KGxpc3RfZGlzdF9tYXRfbWFyLCBmaWxlID0gIi4vb3V0cHV0L2xpc3RfZGlzdF9tYXRfbWFyLnR4dCIpDQpgYGANCg0KDQojIyBCcnVubyBNYXJzDQoNCmBgYHtyfQ0KbWVhbl9tYXRfYnJ1IDwtIG1hdHJpeCgwLCBucm93ID0gMywgbmNvbCA9IDMsIA0KICAgICAgICAgICAgICAgICAgICAgICBkaW1uYW1lcyA9IGxpc3QoYygiLTEiLCIwIiwiMSIpLCBjKCItMSIsIjAiLCIxIikpKQ0KDQpmb3IgKG1hdCBpbiAxOmxlbmd0aChsaXN0X21hcmtvdl9maXRzX2JydSkpew0KICAgICAgbWF0X2RpbSA9IGRpbShsaXN0X21hcmtvdl9maXRzX2JydVtbbWF0XV0pDQogICAgICBpZih0cnlDYXRjaChtYXRfZGltWzFdPT0gMyAmJiANCiAgICAgICAgICAgICAgICAgIG1hdF9kaW1bMl0gPT0gMywgZXJyb3I9ZnVuY3Rpb24oZSkgRkFMU0UpKXsNCiAgICAgICAgIG1lYW5fbWF0X2JydSA9IG1lYW5fbWF0X2JydSArIGxpc3RfbWFya292X2ZpdHNfYnJ1W1ttYXRdXQ0KICAgICAgICAgfQ0KfSAgDQptZWFuX21hdF9icnUgPC0gbWVhbl9tYXRfYnJ1L2xlbmd0aChsaXN0X21hcmtvdl9maXRzX2JydSkNCm1lYW5fbWF0X2JydQ0KY2FwdHVyZS5vdXRwdXQobWVhbl9tYXRfYnJ1LCBmaWxlID0gIi4vb3V0cHV0L21lYW5fbWF0X2JydS50eHQiKQ0KYGBgDQoNCmBgYHtyfQ0KbGlzdF9kaXN0X21hdF9icnUgPC0gYygpDQpmb3IgKG1hdCBpbiAxOmxlbmd0aChsaXN0X21hcmtvdl9maXRzX2JydSkpew0KICAgICAgbWF0X2RpbSA9IGRpbShsaXN0X21hcmtvdl9maXRzX2JydVtbbWF0XV0pDQogICAgICBpZih0cnlDYXRjaChtYXRfZGltWzFdPT0gMyAmJiANCiAgICAgICAgICAgICAgICAgIG1hdF9kaW1bMl0gPT0gMywgZXJyb3I9ZnVuY3Rpb24oZSkgRkFMU0UpKXsNCiAgICAgICAgIGxpc3RfZGlzdF9tYXRfYnJ1W21hdF0gPSBub3JtKGxpc3RfbWFya292X2ZpdHNfYnJ1W1ttYXRdXS1tZWFuX21hdF9icnUsICIyIikNCiAgICAgICAgIH0NCn0gIA0KbGlzdF9kaXN0X21hdF9icnUgPSBsaXN0X2Rpc3RfbWF0X2JydVstd2hpY2goc2FwcGx5KGxpc3RfZGlzdF9tYXRfYnJ1LCBpcy5uYSkpXQ0KbGlzdF9kaXN0X21hdF9icnUNCmNhcHR1cmUub3V0cHV0KGxpc3RfZGlzdF9tYXRfYnJ1LCBmaWxlID0gIi4vb3V0cHV0L2xpc3RfZGlzdF9tYXRfYnJ1LnR4dCIpDQpgYGANCg0KYGBge3J9DQpsZW5ndGgobGlzdF9kaXN0X21hdF9lZCkgLyBkaW0oZGZfZWRfc2hlZXJhbilbMV0NCmxlbmd0aChsaXN0X2Rpc3RfbWF0X2JleSkgLyBkaW0oZGZfYmV5b25jZSlbMV0NCmxlbmd0aChsaXN0X2Rpc3RfbWF0X2NvbGQpIC8gZGltKGRmX2NvbGQpWzFdDQpsZW5ndGgobGlzdF9kaXN0X21hdF9tYXIpIC8gZGltKGRmX21hcilbMV0NCmxlbmd0aChsaXN0X2Rpc3RfbWF0X2JydSkgLyBkaW0oZGZfYnJ1KVsxXQ0KYGBgDQoNCmBgYHtyfQ0KIyBkZXZ0b29sczo6aW5zdGFsbF9naXRodWIoJ2hhZGxleS9nZ3Bsb3QyJykgIyB1bmNvbW1lbnQgYW5kIHJ1biBjb2RlIHRvIGluc3RhbGwgdGhlIGRldiB2ZXJzaW9uIG9mIGdncGxvdDIuDQpsaWJyYXJ5KHBsb3RseSkNCg0KZWRfc2hlZXJhbl9ub3JtcyA8LSBkYXRhLmZyYW1lKG5vcm1EaXN0ID0gdW5saXN0KGxpc3RfZGlzdF9tYXRfZWQpKQ0KYmV5b25jZV9ub3JtcyA8LSBkYXRhLmZyYW1lKG5vcm1EaXN0ID0gdW5saXN0KGxpc3RfZGlzdF9tYXRfYmV5KSkNCmNvbGRwbGF5X25vcm1zIDwtIGRhdGEuZnJhbWUobm9ybURpc3QgPSB1bmxpc3QobGlzdF9kaXN0X21hdF9jb2xkKSkNCm1hcm9vbjVfbm9ybXMgPC0gZGF0YS5mcmFtZShub3JtRGlzdCA9IHVubGlzdChsaXN0X2Rpc3RfbWF0X21hcikpDQpicnVub19ub3JtcyA8LSBkYXRhLmZyYW1lKG5vcm1EaXN0ID0gdW5saXN0KGxpc3RfZGlzdF9tYXRfYnJ1KSkNCg0KIyBjb21iaW5lIHlvdXIgZGF0YWZyYW1lcyBpbnRvIG9uZS4gIEZpcnN0IG1ha2UgYSBuZXcgY29sdW1uIGluIGVhY2guDQplZF9zaGVlcmFuX25vcm1zJEFydGlzdCA8LSAnRWQgU2hlZXJhbicNCmJleW9uY2Vfbm9ybXMkQXJ0aXN0IDwtICdCZXlvbmNlJw0KY29sZHBsYXlfbm9ybXMkQXJ0aXN0IDwtICdDb2xkcGxheScNCm1hcm9vbjVfbm9ybXMkQXJ0aXN0IDwtICdNYXJvb24gNScNCmJydW5vX25vcm1zJEFydGlzdCA8LSAnQnJ1bm8gTWFycycNCg0KIyBjb21iaW5lIGludG8geW91ciBuZXcgZGF0YSBmcmFtZSBhcnRpc3Rfbm9ybXMuDQphcnRpc3Rfbm9ybXMgPC0gcmJpbmQoZWRfc2hlZXJhbl9ub3JtcywgYmV5b25jZV9ub3JtcywgDQogICAgICAgICAgICAgICAgICAgICAgY29sZHBsYXlfbm9ybXMsIG1hcm9vbjVfbm9ybXMsIGJydW5vX25vcm1zKQ0KDQojIGNyZWF0ZSBvdXIgYXdlc29tZSBwbG90Lg0KcC4xIDwtIGdncGxvdChhcnRpc3Rfbm9ybXMsIGFlcyhub3JtRGlzdCwgZmlsbCA9IEFydGlzdCkpICsgZ2VvbV9kZW5zaXR5KGFscGhhID0gMC4yKQ0KDQpwLjEgPC0gZ2dwbG90bHkocC4xKQ0KDQpwLjENCiMgaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KHApLCAiMDEtZGVuc2l0eV9wbG90X292ZXJsYXAuaHRtbCIpDQpgYGANCg0KYGBge3J9DQpwLjIgPC0gZ2dwbG90KGFydGlzdF9ub3JtcywgYWVzKHggPSBub3JtRGlzdCkpICsgDQogIGdlb21fZGVuc2l0eShhZXMoZmlsbCA9IEFydGlzdCkpICsgDQogIGZhY2V0X2dyaWQofkFydGlzdCkgKyANCiAgZ2d0aXRsZSgiTm9ybWFsIERpc3RhbmNlIGRlbnNpdHkgcGxvdHMgYnkgQXJ0aXN0cyIpDQoNCnAuMiA8LSBnZ3Bsb3RseShwLjIpDQpwLjINCiMgaHRtbHdpZGdldHM6OnNhdmVXaWRnZXQoYXNfd2lkZ2V0KHAuMiksICIwMi1kZW5zaXR5X3Bsb3Rfbm9uLW92ZXJsYXAuaHRtbCIpDQpgYGANCg0KYGBge3J9DQpwLjMgPC0gcGxvdF9seShhcnRpc3Rfbm9ybXMsIA0KICAgICAgICAgICAgICAgeCA9IH5ub3JtRGlzdCwgDQogICAgICAgICAgICAgICBjb2xvciA9IH5BcnRpc3QsIA0KICAgICAgICAgICAgICAgdHlwZSA9ICJib3giKQ0KcC4zDQojIGh0bWx3aWRnZXRzOjpzYXZlV2lkZ2V0KGFzX3dpZGdldChwLjMpLCAiMDMtYXJ0aXN0c19ib3hfcGxvdHMuaHRtbCIpDQpgYGANCg0KYGBge3J9DQp0ZXN0LnR4dCA8LSByZWFkLnRhYmxlKCIuL291dHB1dC9saXN0X2Rpc3RfbWF0X2VkLnR4dCIsIGhlYWRlcj1UKQ0KdGVzdC50eHQgDQpgYGANCg0KDQpgYGB7cn0NCmdnbmV0MihuZXR3b3JrKHJncmFwaCgxMCwgdHByb2IgPSAwLjI1KSwgZGlyZWN0ZWQgPSBUUlVFKSwgYXJyb3cuc2l6ZSA9IDEyKQ0KYGBgDQoNCg0KIyMjIEFwcGVuZGl4IGNvZGU6DQoNCmBgYHtyfQ0KIyBtZWFuX21hdF9lZCA8LSBtYXRyaXgoMCwgbnJvdyA9IDMsIG5jb2wgPSAzLCBkaW1uYW1lcyA9IGxpc3QoYygiLTEiLCIwIiwiMSIpLCBjKCItMSIsIjAiLCIxIikpKQ0KIyANCiMgZm9yIChtYXQgaW4gMTpsZW5ndGgobGlzdF9tYXJrb3ZfZml0c19lZCkpeyANCiMgICAgICAgbWVhbl9tYXRfZWQgPSBtZWFuX21hdF9lZCArIGxpc3RfbWFya292X2ZpdHNfZWRbW21hdF1dDQojIH0NCiMgDQojIG1lYW5fbWF0X2VkIDwtIG1lYW5fbWF0X2VkL2xlbmd0aChsaXN0X21hcmtvdl9maXRzX2VkKQ0KIyBtZWFuX21hdF9lZA0KIyBjYXB0dXJlLm91dHB1dChtZWFuX21hdF9lZCwgZmlsZSA9ICIuL291dHB1dC9tZWFuX21hdF9lZC50eHQiKQ0KYGBgDQoNCmBgYHtyfQ0KIyBsaXN0KGxpc3RfbWFya292X2ZpdHNfZWRbWzFdXSwgbGlzdF9tYXJrb3ZfZml0c19lZFtbMl1dKQ0KYGBgDQoNCmBgYHtyfQ0KIyBsaXN0X21hcmtvdl9maXRzX2JleV9jbGVhbiA9IGxpc3RfbWFya292X2ZpdHNfYmV5Wy13aGljaChzYXBwbHkobGlzdF9tYXJrb3ZfZml0c19iZXksIGRpbSAhPSBjKDMsIDMpKSldDQojIG1lYW5fbWF0X2JleSA8LSBSZWR1Y2UoJysnLCBsaXN0X21hcmtvdl9maXRzX2JleSkgLyBsZW5ndGgobGlzdF9tYXJrb3ZfZml0c19iZXkpDQojIG1lYW5fbWF0X2JleQ0KYGBgDQoNCmBgYHtyfQ0KIyBtZWFuX21hdF9tYXIgPC0gbWF0cml4KDAsIG5yb3cgPSAzLCBuY29sID0gMywgZGltbmFtZXMgPSBsaXN0KGMoIi0xIiwiMCIsIjEiKSwgYygiLTEiLCIwIiwiMSIpKSkNCiMgDQojIGZvciAobWF0IGluIDE6bGVuZ3RoKGxpc3RfbWFya292X2ZpdHNfbWFyKSl7DQojICAgICAgIG1lYW5fbWF0X21hciA9IG1lYW5fbWF0X21hciArIGxpc3RfbWFya292X2ZpdHNfbWFyW1ttYXRdXQ0KIyB9ICANCiMgbWVhbl9tYXRfbWFyIDwtIG1lYW5fbWF0X21hci9sZW5ndGgobGlzdF9tYXJrb3ZfZml0c19tYXIpDQojIG1lYW5fbWF0X21hcg0KIyBjYXB0dXJlLm91dHB1dChtZWFuX21hdF9jb2xkLCBmaWxlID0gIi4vb3V0cHV0L21lYW5fbWF0X21hci50eHQiKQ0KYGBg